#include "osLib.h"


/* 位图快速查找表*/
static const uint8_t quickFindTable[] =
{
    /* 00 */ 0xFF,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 10 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 20 */    5,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 30 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 40 */    6,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 50 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 60 */    5,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 70 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 80 */    7,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 90 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* A0 */    5,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* B0 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* C0 */    6,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* D0 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* E0 */    5,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* F0 */    4,  0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};



/*****************************************************************************
 * @function        vBitmapInit
 * @brief 			初始化bitmap.
 *
 * 此函数用于对bitmap结构体进行初始化
 *  
 * @param[in] 		bitmap 指向bitmap位图的结构体指针.
 * 
 * @return 			None
 *
 * ***************************************************************************/
void vBitmapInit(BITMAP_T *bitmap)
{
    bitmap->bitmap = 0x00000000;
}


/*****************************************************************************
 * @function        vBitmapSet
 * @brief 			对bitmap位图进行 位置1.
 *
 * 此函数用于对bitmap位图进行 位置1.
 *  
 * @param[in] 		bitmap  指向bitmap位图的结构体指针.
 * @param[in]       pos     要置1的 位号
 * 
 * @return 			None
 *
 * ***************************************************************************/
void vBitmapSet(BITMAP_T *bitmap, uint32_t pos)
{
    bitmap->bitmap |= (1 << pos);
}

/*****************************************************************************
 * @function        vBitmapClear
 * @brief 			对bitmap位图进行 位置0.
 *
 * 此函数用于对bitmap位图进行 位置0.
 *  
 * @param[in] 		bitmap  指向bitmap位图的结构体指针.
 * @param[in]       pos     要置0的 位号
 * 
 * @return 			None
 *
 * ***************************************************************************/
void vBitmapClear(BITMAP_T *bitmap, uint32_t pos)
{
    bitmap->bitmap &= ~(1 << pos);
}


/*****************************************************************************
 * @function        vBitmapGetFirstSet
 * @brief 			查找bitmap位图中最先置1的位号，从最低位开始，LSB--->MSB
 *
 * 此函数用于查找bitmap位图中最先置1的位号，从最低位开始，LSB--->MSB
 *  
 * @param[in] 		bitmap  指向bitmap位图的结构体指针.
 * 
* @return 			返回最先置1的位号，若位图中没有置1位，则返回0xFFFFFFFF
 *
 * ***************************************************************************/
uint32_t vBitmapGetFirstSet(BITMAP_T *bitmap)
{
    if (bitmap->bitmap & 0xFF)
    {
        return quickFindTable[bitmap->bitmap & 0xFF];
    }
    else if(bitmap->bitmap & 0xFF00)
    {
        return quickFindTable[ (bitmap->bitmap >> 8) & 0xFF] + 8; 
    }
    else if(bitmap->bitmap & 0xFF0000)
    {
        return quickFindTable[ (bitmap->bitmap >> 16) & 0xFF] + 16; 
    }
    else if(bitmap->bitmap & 0xFF000000)
    {
        return quickFindTable[ (bitmap->bitmap >> 24) & 0xFF] + 24; 
    }
    else 
    {
        return 0xFFFFFFFF;
    }
}


/*****************************************************************************
 * @function        vBitmapGetPosCount
 * @brief 			返回位图的位长.
 *
 * 此函数用于返回位图的位长.
 * 
 * @return 			返回位图的长度
 *
 * ***************************************************************************/
uint32_t vBitmapGetPosCount(void)
{
    return 32;
}



/*****************************************************************************
 * @function        vBitmapTest
 * @brief 			位图功能测试函数.
 *
 * 此函数用于测试位图各个操作功能是否正常，初始化、设置位、查找优先位、清零位
 * 
 * @return 			返回位图的长度
 *
 * ***************************************************************************/
void vBitmapTest(void)
{
//    int i;
//    BITMAP_T bitmap;
//    uint32_t pri;

//    vBitmapInit(&bitmap);
//    
//    for (i = vBitmapGetPosCount() - 1; i >= 0; i--)
//    {
//        vBitmapSet(&bitmap, i);
//        
//        pri = vBitmapGetFirstSet(&bitmap);
//    }
//    
//    for (i = 0; i < vBitmapGetPosCount(); i++)
//    {
//        vBitmapClear(&bitmap, i);
//        
//        pri = vBitmapGetFirstSet(&bitmap);
//    }

}


